# -*- coding: utf-8 -*-
# 1.完成以下操作
import torch

# 1.创建一个未初始化的张量，元素值未定义，并输出
torch_empty = torch.empty(size=(5, 3))
print(torch_empty)
# 2.创建一个元素值在[0, 1)范围内随机初始化的张量，赋值给x_random并输出
x_random = torch.rand(size=(5, 3))
print(x_random)
# 3.创建一个所有元素值都是0的张量，数据类型为long，并输出
torch_zeros = torch.zeros(size=(5, 3), dtype=torch.long)
print(torch_zeros)
# 4.使用给定的数据创建一个张量，赋值给x_data，并输出
x_data = torch.tensor([1.0, 2.0, 3.0])
print(x_data)
# 5.创建另一个随机初始化的张量，并赋值给y
y = torch.rand(size=(5, 3))
print(y)
# 6.对x_random和y进行相加，使用torch.add函数进行张量加法，并输出
print(torch.add(x_random, y))
# 7.使用索引从x_random张量中选择第二列的所有元素，并输出
print(x_random[:, 1])
# 8.创建一个形状为(4, 4)的标准正态分布随机数张量，赋值给x_reshaped
x_reshaped = torch.randn(size=(4, 4))
print(x_reshaped)
# 9.将x_reshaped张量扁平化为一维张量
torch_reshape = torch.reshape(x_reshaped, shape=(16,))
print(torch_reshape.shape)
# 10.将x_reshaped张量改变形状为(-1, 8)，其中-1表示该维度的大小自动计算， 并输出
t = torch.reshape(torch_reshape, shape=(-1, 8))
print(t.shape)
# 11.创建需要梯度的权重和偏置张量，赋值给w，b，x
w = torch.tensor([1.0], requires_grad=True)
b = torch.tensor([2.0], requires_grad=True)
x = torch.tensor([3.0])
# 12.计算y = w * x + b
y = w * x + b
y.backward()
# 13.反向传播计算梯度，并输出
print(w.grad)
print(b.grad)
